package com.xry.task;

import com.xry.mapper.UserDao;
import com.xry.util.ImageUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
public class ImageCleanTask {
    private static final Logger log = LoggerFactory.getLogger(ImageCleanTask.class);

    @Autowired
    private UserDao userDao;

    /**
     * 每天凌晨3点执行图片清理（cron表达式：秒 分 时 日 月 周）
     */
    @Scheduled(cron = "0 11 3 * * ?")
    public void cleanUnusedImages() {
        log.info("开始执行图片清理任务...");

        try {
            // 1. 从数据库获取所有有效图片URL（已去重）
            List<String> dbImageUrls = userDao.findAllValidUimg();
            log.info("数据库中有效图片数量: {}", dbImageUrls.size());

            // 2. 从OSS获取所有图片文件名，并转换为完整URL
            List<String> ossFileNames = ImageUtil.getFileList();
            List<String> ossImageUrls = ossFileNames.stream()
                    .map(name -> "https://" + ImageUtil.BUCKET_NAME + "." + ImageUtil.ENDPOINT + "/" + name)
                    .collect(Collectors.toList());
            log.info("OSS中图片数量: {}", ossImageUrls.size());

            // 3. 找出OSS中存在但数据库中不存在的图片URL（需要删除的）
            List<String> toDeleteUrls = ossImageUrls.stream()
                    .filter(url -> !dbImageUrls.contains(url))
                    .collect(Collectors.toList());
            log.info("需要删除的冗余图片数量: {}", toDeleteUrls.size());

            // 4. 转换URL为OSS文件名（截取最后一个"/"后的部分）
            List<String> toDeleteFileNames = toDeleteUrls.stream()
                    .map(url -> url.substring(url.lastIndexOf("/") + 1))
                    .collect(Collectors.toList());

            // 5. 批量删除OSS中的冗余图片
            if (!toDeleteFileNames.isEmpty()) {
                ImageUtil.deleteList(toDeleteFileNames);
            }

            log.info("图片清理任务执行完成");
        } catch (Exception e) {
            log.error("图片清理任务执行失败", e);
        }
    }
}